{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/burn/.local/lib/python3.8/site-packages/jax/lib/xla_bridge.py:130: UserWarning: No GPU/TPU found, falling back to CPU.\n",
      "  warnings.warn('No GPU/TPU found, falling back to CPU.')\n"
     ]
    }
   ],
   "source": [
    "import jax.numpy as np\n",
    "import jax.random as jnp_random\n",
    "import numpy.random as npr\n",
    "import numpy as onp\n",
    "from jax import grad, jacrev, jacfwd, jit, vmap, partial\n",
    "from jax.nn import relu\n",
    "from jax.lax import scan, cond\n",
    "from jax.ops import index, index_add, index_update\n",
    "from jax.flatten_util import ravel_pytree\n",
    "from jax.scipy.special import logsumexp\n",
    "from jax.numpy import concatenate as cat\n",
    "from jax.experimental import stax, optimizers\n",
    "from jax.nn.initializers import normal\n",
    "\n",
    "import random\n",
    "import pickle as pkl\n",
    "import scipy\n",
    "\n",
    "from IPython.display import clear_output\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "\n",
    "# import dynamics f(x, u) and equilibrium policy pi\n",
    "# importing the lunar lander dynamics and stabilization policy pi \n",
    "from mylunarlander import f, pi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "@jit\n",
    "def p(x): # target distribution\n",
    "    s = x[:2]\n",
    "    x1 = s-np.array([0.7, 0.5])\n",
    "    x2 = s+np.array([-0.4, 0.3])\n",
    "    x3 = s-np.array([-0.7, 0.6])\n",
    "\n",
    "    return np.exp(-0.5*np.sum((x1/0.19)**2)) \\\n",
    "            + np.exp(-0.5*np.sum((x2/0.15)**2)) \\\n",
    "            + np.exp(-0.5*np.sum((x3/0.4)**2)) \\\n",
    "\n",
    "@jit\n",
    "def dist(x, s): # log pdf on individual point in robot trajectory\n",
    "    dx = x[:2]-s\n",
    "    return -0.5 * np.sum((dx/0.1)**2)\n",
    "\n",
    "def kle3_rollout(x, u):\n",
    "    u_eq = pi(x) + u\n",
    "    x = f(x, u_eq)\n",
    "    return x, x\n",
    "\n",
    "logexp_vmap = lambda _x, _s: logsumexp(vmap(dist, in_axes=(0, None))(_x, _s))\n",
    "\n",
    "def kle3_loss(u, x0, si):\n",
    "    xf, tr = scan(kle3_rollout, x0, u)\n",
    "    logqi = vmap(partial(logexp_vmap, tr))(si)\n",
    "    pi = vmap(p)(si)\n",
    "    pi = pi/(np.sum(pi) + 1e-3) # normalize\n",
    "    ell = -np.sum(logqi*pi)\n",
    "    return ell + 1e-5*np.mean(u**2)\n",
    "\n",
    "djdu = jit(grad(kle3_loss))\n",
    "def kle3(u, x0, key, epochs=20, lr=1e-1):\n",
    "    si = jnp_random.uniform(key, shape=(60,2), minval=-1., maxval=1.)\n",
    "    for e in range(epochs):\n",
    "        u = u - lr * djdu(u, x0, si)\n",
    "    return u\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "u = np.zeros((100, 2))\n",
    "x0 = np.zeros(6)\n",
    "traj = []\n",
    "\n",
    "key = jnp_random.PRNGKey(0)\n",
    "random.seed(0)\n",
    "\n",
    "for t in range(500):\n",
    "    traj.append(x0.copy())\n",
    "    key, subkey = jnp_random.split(key)\n",
    "    u = kle3(u, x0, subkey)    \n",
    "    u_eq = pi(x0) + u[0]\n",
    "    x0 = f(x0, u_eq)\n",
    "    u = index_update(u, index[:-1,:], u[1:,:])\n",
    "    u = index_update(u, index[-1,:], u[-1])\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'robot trajectory')"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "traj = np.stack(traj)\n",
    "X, Y = onp.meshgrid(*[np.linspace(-1,1)]*2)\n",
    "x_pts = np.stack([X.ravel(), Y.ravel()]).T\n",
    "p_eval = vmap(p, )(x_pts).reshape(X.shape)\n",
    "plt.contourf(X, Y, p_eval)\n",
    "plt.plot(traj[:,0], traj[:,1], '*')\n",
    "plt.axis('equal')\n",
    "plt.axis('square')\n",
    "plt.title('robot trajectory')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
